package com.xoa.service.file.impl;


import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import java.util.Map;

import java.util.*;


import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import com.xoa.controller.file.FileSortWrappers;
import com.xoa.dao.auth.AuthMapper;
import com.xoa.model.file.FileAuthBaseModel;
import com.xoa.model.file.FileAuthWrapper;
import com.xoa.model.file.FileContentModel;
import com.xoa.service.file.FileSortResetAuth;
import com.xoa.service.users.UsersService;
import com.xoa.util.common.L;
import com.xoa.util.common.StringUtils;
import com.xoa.util.common.wrapper.BaseWrapper;
import com.xoa.util.common.wrapper.BaseWrappers;
import com.xoa.util.netdisk.CheckAll;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.xoa.dao.file.FileSortMapper;
import com.xoa.model.file.FileSortModel;
import com.xoa.service.file.FileSortService;
import com.xoa.util.ToJson;
import org.springframework.transaction.annotation.Transactional;

/**
 * 
 * 创建作者:   杨 胜
 * 创建日期:   2017-4-19 上午9:24:55
 * 类介绍  :    文件柜service实现类
 * 构造参数:   默认
 *
 */
@Service
public class FileSortServiceImpl  implements FileSortService{
	@Resource
	FileSortMapper file_SortMapper;
	@Autowired
	AuthMapper authMapper;

	@Resource
	UsersService usersService;
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-4-19 上午9:30:51
	 * 方法介绍:   动态查询File_Sort返回json数据
	 * 参数说明:   @param file
	 * 参数说明:   @return
	 * @return   ToJson<FileSortModel>
	 */
	public ToJson<FileSortModel> getFileSortJson(FileSortModel file) {
		ToJson<FileSortModel> toJson = new ToJson<FileSortModel>(0,"显示结果");
		List<FileSortModel> list=file_SortMapper.getFileSort(file);
		toJson.setObj(list);
		return toJson;
	
	}
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-4-19 上午9:31:07
	 * 方法介绍:   动态查询 File_Sort返回<FileSortModel> list数组
	 * 参数说明:   @param file
	 * 参数说明:   @return
	 * @return     List<FileSortModel>
	 */
	@Override
	public List<FileSortModel> getFileSortList(FileSortModel file) {
		return file_SortMapper.getFileSort(file);
	}
	
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-4-19 上午9:31:20
	 * 方法介绍:   动态查询  File_Sort
	 * 参数说明:   @param file
	 * 参数说明:   @return
	 * @return     ToJson<FileSortModel>
	 */
	@Override
	public ToJson<FileSortModel> getFileSortBySortId(FileSortModel file) {
		ToJson<FileSortModel> toJson = new ToJson<FileSortModel>(0,"显示结果");
		List<FileSortModel> list=file_SortMapper.getFileSort(file);
		toJson.setObj(list);
		return toJson;
	}
	
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-4-19 上午9:31:34
	 * 方法介绍:   添加目录树文件夹
	 * 参数说明:   @param file
	 * 参数说明:   @return
	 * @return     int
	 */
	@Override
	public int saveFileSort(FileSortModel file) {
		return file_SortMapper.saveFileSortChr(file);
	}
	
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-4-19 上午9:56:15
	 * 方法介绍:   修改目录树文件夹信息
	 * 参数说明:   @param file
	 * 参数说明:   @return
	 * @return     int
	 */
	@Override
	public int updateFileSort(FileSortModel file) {
		return file_SortMapper.updateFileSort(file);
	}
	
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-4-19 上午9:56:26
	 * 方法介绍:   删除目录树文件夹信息
	 * 参数说明:   @param fileParent
	 * 参数说明:   @return
	 * @return     int
	 */
	@Override
	public int deleteBySortId(Map<String, Object> fileParent) {
		return  file_SortMapper.deleteBySortId(fileParent);
	}
	
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-4-19 上午9:56:37
	 * 方法介绍:   根据某个父节点信息获取目录树子文件夹信息
	 * 参数说明:   @param tempNo
	 * 参数说明:   @return
	 * @return     List<FileSortModel>
	 */
	@Override
	public List<FileSortModel> getSortChrildren(int tempNo) {
		return file_SortMapper.getSortChrildren(tempNo);
	}
	
	
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-4-19 上午9:56:50
	 * 方法介绍:   获取目录树父文件夹信息
	 * 参数说明:   @param sortid
	 * 参数说明:   @return
	 * @return   List<FileSortModel>
	 */
	@Override
	public List<FileSortModel> getRootTree(Map<String,Object> rootMap) {
		return file_SortMapper.getRootTree(rootMap);
	}

	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-4-19 上午9:57:07
	 * 方法介绍:   获取所有子文件夹信息
	 * 参数说明:   @param sortid
	 * 参数说明:   @return
	 * @return     List<FileSortModel>
	 */
	@Override
	public List<FileSortModel> getChildTree(List<String> sortidList) {
		return file_SortMapper.getChildTree(sortidList);
	}
	/**
     * 
     * 创建作者:   杨 胜
     * 创建日期:   2017-4-20 上午9:39:32
     * 方法介绍:   添加子文件夹
     * 参数说明:   @param file
     * 参数说明:   @return
     * @return   int 添加子文件夹影响行
     */
	@Override
	public int saveFileSortChr(FileSortModel file) {
		return file_SortMapper.saveFileSortChr(file);
	}

	@Override
	public BaseWrapper setFileSortAuth(Map<String, Object> mmp) {
		BaseWrapper wrapper =new BaseWrapper();
		wrapper.setStatus(true);
		wrapper.setFlag(false);
		wrapper.setMsg("操作失败");
		if(mmp==null){

			return wrapper;
		}
		Integer sortId=(Integer) mmp.get("sortId");
        if(sortId==null){
        	return wrapper;
		}
		FileSortResetAuth resetAuth =new FileSortResetAuth();

		Map<String,String> param=resetAuth.reset("userId", (Map<String, String>)mmp.get("userId"))
				.reset("manageUser",(Map<String, String>)mmp.get("manageUser"))
				.reset("delUser",(Map<String, String>)mmp.get("delUser"))
				.reset("downUser",(Map<String, String>)mmp.get("downUser"))
				.reset("shareUser",(Map<String, String>)mmp.get("shareUser"))
				.reset("owner",(Map<String, String>)mmp.get("owner"))
				.reset("signUser",(Map<String, String>)mmp.get("signUser"))
				.reset("review",(Map<String, String>)mmp.get("review"))
				.reset("description",(Map<String, String>)mmp.get("description"))
				.reset("newUser",(Map<String, String>)mmp.get("newUser"))
				.getParam();
		param.put("sortId",sortId.toString());
		Integer userIdRestTimes =checkUpdateChild(resetAuth.reset("userId", (Map<String, String>)mmp.get("userId")).getParam(),
				sortId.toString());
		Integer manageUserRestTimes =checkUpdateChild(resetAuth.reset("manageUser", (Map<String, String>)mmp.get("manageUser")).getParam(),
				sortId.toString());
		Integer delUserRestTimes =checkUpdateChild(resetAuth.reset("delUser", (Map<String, String>)mmp.get("delUser")).getParam(),
				sortId.toString());
		Integer downUserRestTimes =checkUpdateChild(resetAuth.reset("downUser", (Map<String, String>)mmp.get("downUser")).getParam(),
				sortId.toString());
		Integer shareUserRestTimes =checkUpdateChild(resetAuth.reset("shareUser", (Map<String, String>)mmp.get("shareUser")).getParam(),
				sortId.toString());
		Integer ownerRestTimes =checkUpdateChild(resetAuth.reset("owner", (Map<String, String>)mmp.get("owner")).getParam(),
				sortId.toString());
		Integer signUserRestTimes =checkUpdateChild(resetAuth.reset("signUser", (Map<String, String>)mmp.get("signUser")).getParam(),
				sortId.toString());
		Integer reviewRestTimes =checkUpdateChild(resetAuth.reset("review", (Map<String, String>)mmp.get("review")).getParam(),
				sortId.toString());
		Integer descriptionRestTimes =checkUpdateChild(resetAuth.reset("description", (Map<String, String>)mmp.get("description")).getParam(),
				sortId.toString());
		Integer newUserRestTimes =checkUpdateChild(resetAuth.reset("newUser", (Map<String, String>)mmp.get("newUser")).getParam(),
				sortId.toString());
		int res =file_SortMapper.updateSortAuth(param);
		if(res>0){
			wrapper.setStatus(true);
			wrapper.setFlag(true);
			wrapper.setMsg("操作成功");
		}else{
			wrapper.setStatus(true);
			wrapper.setFlag(false);
			wrapper.setMsg("操作失败");
		}
		return wrapper;
	}
    private final static String STATUS_EXTENDS_TURE="1";//子类继承这个权限;
	private final static String STATUS_EXTENDS_FALSE="0";//子类不继承这个权限;
	private int checkUpdateChild(Map<String, String> mmp,String sortId) {

		if(mmp==null){
			return -1;
		}
		if(mmp.containsKey("isExtends")){
			if("1".equals(mmp.get("isExtends").trim())){
				//查出所有的子类id；
				try{
				List<FileSortModel>	childSort=file_SortMapper.getSortChrildren(Integer.parseInt(sortId));
					List<Integer> childSortId = null;
				if(childSort!=null&&childSort.size()>0){
					childSortId=new ArrayList<Integer>();
					for(FileSortModel model:childSort){
						childSortId.add(model.getSortId());
					}
				}
				if(childSortId!=null&&childSortId.size()>0){
					Map<String,Object> map=new HashMap<String,Object>();
					map.putAll(mmp);
					map.put("sortIds",childSortId);
				  return 	file_SortMapper.updateSortAuthByChildSort(map);
				}else{
					return -1;
				}
				}catch (Exception e){
					e.printStackTrace();
					return -2;
				}
			}else{
				return 0;
			}
		}else{
			return -1;
		}
	}

	@Override
	public FileAuthWrapper getAuthBySortId(Integer sortId) {
		FileAuthWrapper wrapper =new FileAuthWrapper();

		//获取左侧树结构
		//查询出所有sortId下的子集
		List<FileSortModel> listAll=file_SortMapper.getChildTreeList();
		List<FileSortModel> newlist =new ArrayList<FileSortModel>();
		  newlist=diguiFileSort(listAll,0,sortId,newlist);
//		List<FileSortModel> list =file_SortMapper.queryFileSortAndChildBySortId(sortId);
		wrapper.setFileSorts(newlist);
		//当前页权限
		FileSortModel model =file_SortMapper.getNowFileSortAuth(sortId);
		FileAuthBaseModel auth =new FileAuthBaseModel();
		List<String> useds=new ArrayList<String>();
		if(model!=null){
			String[] userIds =FileSortResetAuth.getAuthBase(model.getUserId());
			String[] newUsers =FileSortResetAuth.getAuthBase(model.getNewUser());
			String[]  managerUsers =FileSortResetAuth.getAuthBase(model.getManagerUser());
			String[] delUsers =FileSortResetAuth.getAuthBase(model.getDelUser());
			String[]  downUsers=FileSortResetAuth.getAuthBase(model.getDownUser());
			String[] owners =FileSortResetAuth.getAuthBase(model.getOwner());
			String[] sharUsers =FileSortResetAuth.getAuthBase(model.getSharUser());
			String[] signUsers =FileSortResetAuth.getAuthBase(model.getSignUser());
			String[] review =FileSortResetAuth.getAuthBase(model.getReview());
			//查询对应的字段
			auth.setUserId(getName(userIds));
			auth.setReview(getName(review));
			auth.setDelUser(getName(delUsers));
			auth.setNewUser(getName(newUsers));
			auth.setManageUser(getName(managerUsers));
			auth.setDownUser(getName(downUsers));
			auth.setOwner(getName(owners));
			auth.setShareUser(getName(sharUsers));
			auth.setSignUser(getName(signUsers));
			wrapper.setData(auth);
			wrapper.setNowFileSortName(model.getSortName());
			//那些有数据需要标记
			if(userIds!=null){
				useds.add("visit");
			}
			if(newUsers!=null){
				useds.add("add");
			}
			if(managerUsers!=null){
				useds.add("edit");
			}if(delUsers!=null){
				useds.add("delete");
			}
			if(downUsers!=null){
				useds.add("download");
			}
			if(owners!=null){
				useds.add("all");
			}
			if(review!=null){
				useds.add("comment");
			}
			if(signUsers!=null){
				useds.add("sign");
			}
            wrapper.setUsed(useds);
			wrapper.setFlag(true);
		}else{
			wrapper.setFlag(false);
			wrapper.setMsg("还未设置权限");
		}


		return wrapper;
	}

	private List<FileSortModel> diguiFileSort(List<FileSortModel> listAll, int i, Integer sortId,List<FileSortModel> resultList) {

		if(i>10) return resultList;

		for(FileSortModel fileSortModel:listAll){
			if(i==0&&fileSortModel.getSortId()==sortId){
				resultList.add(fileSortModel);
			}
			if(fileSortModel.getSortParent()==sortId){
				resultList.add(fileSortModel);
				resultList=diguiFileSort(listAll,i+1,fileSortModel.getSortId(),resultList);
			}
		}
	  return resultList;
	}

	@Override
	public BaseWrapper getFileAuthBySortId(Integer sortId, HttpServletRequest request) {
		BaseWrapper baseWrapper=new BaseWrapper();
		FileSortModel model =file_SortMapper.getNowFileSortAuth(sortId);
		Map<String,Object> map=new Hashtable<String, Object>();
		String userId=String.valueOf(request.getSession().getAttribute("userId"));
		String userPriv=String.valueOf(request.getSession().getAttribute("userPriv"));
		String deptId=String.valueOf(request.getSession().getAttribute("deptId"));

		FileSortModel file=new FileSortModel();
		if(file.getUserId()==null){
			file.setUserId(userId);
		}
		map.put("userId", file.getUserId()==null?userId:file.getUserId());
		map.put("userPriv", userPriv==null?"":userPriv);
		map.put("deptId", deptId==null?"":deptId);
		model.setDelPriv(CheckAll.checkAll(model.getDelUser(),map));
		model.setMakePriv(CheckAll.checkAll(model.getNewUser(),map));
		model.setDownloadPriv(CheckAll.checkAll(model.getDownUser(),map));
		model.setUpdatePriv(CheckAll.checkAll(model.getManagerUser(),map));
		baseWrapper.setData(model);
		baseWrapper.setFlag(true);
		baseWrapper.setStatus(true);
		baseWrapper.setMsg("成功");
		return baseWrapper;
	}

	public FileAuthBaseModel.FileAuthChildModel getName(String[] ids){
		FileAuthBaseModel.FileAuthChildModel child=new FileAuthBaseModel().new FileAuthChildModel();
		FileAuthBaseModel.FileAuthGrandChildModel grandChild=new FileAuthBaseModel().new FileAuthGrandChildModel();
//		String[] ret =new String[3];
		child.setDept("");
		grandChild.setDeptStr("");
		child.setUser("");
		grandChild.setUserStr("");
		child.setRole("");
		grandChild.setRoleStr("");
		child.setData(grandChild);
		if(ids==null){
			return child;
		}
		String dept;
		String role;
		String user;
		switch (ids.length){
			case 0:
				return child;
			case 1:
				dept=ids[0];
				role=null;
				user =null;
				break;
			case 2:
				dept=ids[0];
				role=ids[1];
				user =null;
				break;
			case 3:
				dept=ids[0];
				role=ids[1];
				user =ids[2];
				break;
			default:
				return child;
		}

		if(!StringUtils.checkNull(dept)){
			String ret="";
			if("ALL_DEPT".equals(dept)){
				ret="全部部门";
			}else{
                    List<String> depts = authMapper.getDeptName(dept);
                    StringBuffer sb =new StringBuffer();
                    for(String dep:depts){
						sb.append(dep);
						sb.append(",");
					}
				  ret=sb.toString();
			}
			child.setDept(dept);
			grandChild.setDeptStr(ret);
		}else{
			child.setDept("");
			grandChild.setDeptStr("");
		}
		if(!StringUtils.checkNull(role)){
			List<String> roles = authMapper.getRoleName(role);
			StringBuffer sb =new StringBuffer();
			for(String rol:roles){
				sb.append(rol);
				sb.append(",");
			}
			child.setRole(role);
			grandChild.setRoleStr(sb.toString());
		}
		else{
			child.setRole("");
			grandChild.setRoleStr("");
		}
		if(!StringUtils.checkNull(user)){
			List<String> users = authMapper.getUserName(user);
			StringBuffer sb =new StringBuffer();
			for(String us:users){
				sb.append(us);
				sb.append(",");
			}
			child.setUser(user);
			grandChild.setUserStr(sb.toString());
		}
		else{
			child.setUser("");
			grandChild.setUserStr("");
		}
		child.setData(grandChild);
		return child;
	}
	@Override
	public List<FileSortModel> getChrildrenSort(FileSortModel file) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public FileSortModel getFileSortBySortIds(FileSortModel file) {
		FileSortModel sortModel= file_SortMapper.getOne(file);
		if(!StringUtils.checkNull(sortModel.getSharUser())){
			String sharUser=usersService.getUserNameById(sortModel.getSharUser());
			sortModel.setSharUser(sharUser);
		}
		if(!StringUtils.checkNull(sortModel.getManagerUser())){
			String managerUser=usersService.getUserNameById(sortModel.getManagerUser());
			sortModel.setManagerUser(managerUser);
		}
		return sortModel;
	}
	@Override
	public int getFileCheck(FileSortModel file) {
		return file_SortMapper.getFileCheck(file);
	}

	@Override
	public FileSortModel singleBySortNo(String sortNo) {
		return  file_SortMapper.singleBySortNo(sortNo);
	}

	@Override
	public FileSortModel singleBySortName(String sortName) {
		return  file_SortMapper.singleBySortName(sortName);
	}

	@Override
	public List<FileSortModel> getChildTreeList(String sortId) {
		List<FileSortModel> fileSortModels1= file_SortMapper.getChildTreeList();
		List<FileSortModel> sortModels=new ArrayList<FileSortModel>();
		FileSortModel fileSortModelss=file_SortMapper.getNowFileSortAuth(Integer.parseInt(sortId));
		sortModels.add(fileSortModelss);
		for(FileSortModel fileSortModel:fileSortModels1){
			 if(fileSortModel.getSortNo().equals(sortId)){
				 sortModels.add(fileSortModel);
				 getChildTreeList(String.valueOf(fileSortModel.getSortId()));
			}
		}
		return sortModels;
	}

	/**
	 * 个人文件柜共享和取消共享
	 * @param fileSortModel
	 * @return
	 */
	@Transactional
	public ToJson<FileSortModel> updateSingPriv(FileSortModel fileSortModel){
		ToJson<FileSortModel> json = new ToJson<FileSortModel>(1, "error");
		try{
			int count=file_SortMapper.updateSingPriv(fileSortModel);
			if(count>0){
				json.setObject(fileSortModel);
				json.setMsg("ok");
				json.setFlag(0);
			}
		}catch(Exception e){
			json.setMsg(e.getMessage());
			L.e("FileSortServiceImpl updateSingPriv:"+e);
			e.printStackTrace();
		}
		return  json;
	}

	@Override
	public BaseWrappers getAllPublicFile() {
		BaseWrappers wrappers = new BaseWrappers();
		wrappers.setFlag(true);
		List<FileSortModel> allDatas =file_SortMapper .getAllFileSort();
		List<FileSortModel> datas =file_SortMapper.getPublicFileSort();
		wrappers.setDatas(sortList(allDatas,datas));
		return wrappers;
	}

	@Override
	public BaseWrappers getAllPrivateFile(String  userId) {
		BaseWrappers wrappers = new BaseWrappers();
		wrappers.setFlag(true);
		List<FileSortModel> allDatas =file_SortMapper .getAllFileSort();
		List<FileSortModel> datas =file_SortMapper.getPrivateFileSort(userId);
		wrappers.setDatas(sortList(allDatas,datas));
		return wrappers;
	}

	@Override
	public FileSortWrappers getHomeFileSortInfo(String  userId) {
		FileSortWrappers wrappers =new FileSortWrappers();
		List<FileSortModel> publicDatas =file_SortMapper.getPublicFileSort();
		List<FileSortModel> privateDatas =file_SortMapper.getPrivateFileSort(userId);
		wrappers.setPrivateFileSort(privateDatas);
		wrappers.setPublicFileSort(publicDatas);
		wrappers.setFlag(true);
		return wrappers;
	}


	private List<FileSortModel> sortList(List<FileSortModel> allDatas,List<FileSortModel> datas){
		List<FileSortModel> sortModels =new ArrayList<FileSortModel>();
		if(datas!=null){
			for(FileSortModel fileSortModels:datas){
				sortModels.add(fileSortModels);
				sortModels=diguiSortFile(allDatas,fileSortModels.getSortId(),sortModels);

			}

		}
		return sortModels;
	}

	private List<FileSortModel> diguiSortFile(List<FileSortModel> allDatas, Integer sortId,List<FileSortModel> sortModels) {
//		List<FileSortModel> sortModels =new ArrayList<FileSortModel>();
		for(FileSortModel model:allDatas){
			if(model.getSortParent().intValue()==sortId.intValue()){
				sortModels.add(model);
				sortModels=diguiSortFile(allDatas,model.getSortId(),sortModels);
//				sortModels.addAll(sortModelss);
			}
		}
		return sortModels;
	}
}
